package com.finance.util;

import org.apache.http.*;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.*;
import java.net.*;
import java.util.*;

/**
 * HTTP相关的操作
 *
 * @Date 2011-10-9
 */
@Component
@Deprecated
public class HttpUtil {
    private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
    @Autowired(required = false)
    private CloseableHttpClient httpClient;
    @Autowired(required = false)
    private RequestConfig requestConfig;

    private String doGet(HttpGet httpGet) {
        httpGet.setConfig(this.requestConfig);
        logger.info("开始请求：{}", httpGet.getURI().toString());
        CloseableHttpResponse response = null;
        try {
            // 执行请求
            response = this.httpClient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                return EntityUtils.toString(response.getEntity(), "UTF-8");
            } else {
                logger.error("HTTP错误{}:{}", response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase());

            }
        } catch (ClientProtocolException e) {
            logger.error(e.getMessage(),e);
        } catch (IOException e) {
            logger.error(e.getMessage(),e);
        } finally {
            if (response != null) {
                try {
                    response.close();
                 } catch (IOException e) {
                    logger.error(e.getMessage(),e);
                }
            }
        }
        return "";
    }

    public String doGet(String url) {
        // 创建http GET请求
        HttpGet httpGet = new HttpGet(url);
        return this.doGet(httpGet);
    }

    public String doGet(String url, Map<String, String> params) throws ClientProtocolException, IOException, URISyntaxException {
        URIBuilder uriBuilder = new URIBuilder(url);
        for (String key : params.keySet()) {
            uriBuilder.addParameter(key, params.get(key));
        }
        return this.doGet(uriBuilder.build().toString());
    }

    public String doPost(String url, Map<String, String> params) throws IOException {
        // 创建http POST请求
        HttpPost httpPost = new HttpPost(url);
        requestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();
        httpPost.setConfig(this.requestConfig);
        if (params != null) {
            // 设置2个post参数，一个是scope、一个是q
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            for (String key : params.keySet()) {
                parameters.add(new BasicNameValuePair(key, params.get(key)));
            }
            // 构造一个form表单式的实体
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8");
            // 将请求实体设置到httpPost对象中
            httpPost.setEntity(formEntity);
        }

        CloseableHttpResponse response = null;
        try {
            // 执行请求
            response = this.httpClient.execute(httpPost);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                return EntityUtils.toString(response.getEntity(), "UTF-8");
            } else {
                logger.error("HTTP错误{}:{}", response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase());

            }
        } catch (ClientProtocolException e) {
            logger.error(e.getMessage(),e);
        } catch (IOException e) {
            logger.error(e.getMessage(),e);
        } finally {
            if (response != null) {
                try {
                    response.close();
                 } catch (IOException e) {
                    logger.error(e.getMessage(),e);
                }
            }
        }
        return "";
    }

    /**
     * 执行POST请求
     *
     * @param url
     * @return
     * @throws IOException
     */
    public String doPost(String url) throws IOException {
        return this.doPost(url, null);
    }

    public String requestGetWithSession(String url, String jsessionid) throws ParseException,
            IOException {
        HttpGet httpGet = new HttpGet(url);
        httpGet.addHeader("Cookie", "JSESSIONID=" + jsessionid);
        return this.doGet(httpGet);
    }

}